#include "stc8g.h"
#include "i2c.h"


#define AHT20_ADDR 0x38  // AHT20的I2C地址

static void DelayMs(unsigned int ms) {
    unsigned int i, j;
    for(i = 0; i < ms; i++) {
        for(j = 0; j < 1000; j++) {
            _nop_();
        }
    }
}

void ATH20_Init(void)
{
	I2C_Init();
}


// AHT20读取温湿度
char  AHT20_Read(float *temperature, float *humidity) {
    unsigned char buf[6];
    unsigned long temp_raw = 0, humi_raw = 0;
    
    // 发送触发测量命令
    I2C_Start();
    if(!I2C_WriteByte(AHT20_ADDR << 1)) { // AHT20地址 + 写模式
        I2C_Stop();
        return 0;
    }
    if(!I2C_WriteByte(0xAC)) {      // 触发测量命令
        I2C_Stop();
        return 0;
    }
    if(!I2C_WriteByte(0x33)) {      // 参数1
        I2C_Stop();
        return 0;
    }
    if(!I2C_WriteByte(0x00)) {      // 参数2
        I2C_Stop();
        return 0;
    }
    I2C_Stop();
    
    DelayMs(100); // 等待测量完成
    
    // 读取数据
    I2C_Start();
    if(!I2C_WriteByte(AHT20_ADDR << 1 | 0x01)) { // AHT20地址 + 读模式
        I2C_Stop();
        return 0;
    }
    buf[0] = I2C_ReadByte(1); // 状态字
    buf[1] = I2C_ReadByte(1); // 湿度高字节
    buf[2] = I2C_ReadByte(1); // 湿度低字节
    buf[3] = I2C_ReadByte(1); // 湿度/温度混合字节
    buf[4] = I2C_ReadByte(1); // 温度高字节
    buf[5] = I2C_ReadByte(0); // 温度低字节
    I2C_Stop();
    
    // 计算温湿度值
    humi_raw = ((unsigned long)buf[1] << 12) | ((unsigned long)buf[2] << 4) | (buf[3] >> 4);
    temp_raw = ((unsigned long)(buf[3] & 0x0F) << 16) | ((unsigned long)buf[4] << 8) | buf[5];
    
    *humidity = (float)humi_raw * 100 / 1048576;
    *temperature = (float)temp_raw * 200 / 1048576 - 50;
    return 1;
}